<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Linux用户管理入门教学 - 医院案例版</title>
    <style>
        :root {
            --hospital-blue: #007acc;
            --background-white: #f5f9fc;
        }

        body {
            font-family: 'Segoe UI', Arial, sans-serif;
            line-height: 1.6;
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
            background-color: var(--background-white);
        }

        .header {
            text-align: center;
            padding: 30px;
            background: var(--hospital-blue);
            color: white;
            border-radius: 10px;
            margin-bottom: 30px;
            background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><text x="50" y="50" font-size="80" text-anchor="middle" dominant-baseline="middle" fill="rgba(255,255,255,0.1)">+</text></svg>');
            background-repeat: repeat;
        }

        .nav {
            display: grid;
            grid-template-columns: repeat(5, 1fr);
            gap: 10px;
            margin-bottom: 30px;
        }

        .nav a {
            padding: 15px;
            background: #e3f2fd;
            text-decoration: none;
            color: var(--hospital-blue);
            border-radius: 5px;
            text-align: center;
            transition: 0.3s;
        }

        .nav a:hover {
            background: #bbdefb;
        }

        .section {
            background: white;
            padding: 25px;
            border-radius: 8px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            margin-bottom: 25px;
            display: none; /* 默认隐藏所有页面 */
            opacity: 0;
            transition: opacity 0.5s ease-in-out;
        }
        
        .section.active {
            display: block;
            opacity: 1;
        }

        .command {
            background: #1e1e1e;
            color: #d4d4d4;
            padding: 15px;
            border-left: 4px solid var(--hospital-blue);
            margin: 15px 0;
            font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
            line-height: 1.6;
            border-radius: 4px;
            box-shadow: 0 2px 4px rgba(0,0,0,0.1);
        }
        
        .command .cmd {
            color: #569cd6;
            font-weight: bold;
            display: block;
            margin: 8px 0;
        }
        
        .command .comment {
            color: #6a9955;
            font-style: normal;
            display: block;
            margin: 8px 0;
            padding-left: 20px;
            border-left: 2px solid #6a9955;
        }

        .back-to-top {
            position: fixed;
            bottom: 90px;
            right: 20px;
            width: 60px;
            height: 60px;
            background: var(--hospital-blue);
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-size: 24px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.2);
            cursor: pointer;
            opacity: 0;
            transition: opacity 0.3s;
            text-decoration: none;
        }

        .back-to-top.visible {
            opacity: 1;
        }
        
        .command .cmd {
            color: #88cc00;
            font-weight: bold;
        }
        
        .command .comment {
            color: #7a9ec0;
            font-style: italic;
        }

        table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
        }

        th, td {
            border: 1px solid #ddd;
            padding: 12px;
            text-align: left;
        }

        th {
            background-color: var(--hospital-blue);
            color: white;
        }

        .warning {
            background: #fff3cd;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }

        ol li {
            margin-bottom: 10px;
        }

        .flex-container {
            display: flex;
            justify-content: space-between;
            align-items: flex-start;
            gap: 20px;
        }

        .flex-item {
            flex: 1;
        }

        .config-file {
            background: #2d2d2d;
            color: #e0e0e0;
            padding: 15px;
            border-radius: 5px;
            font-family: 'Courier New', monospace;
            position: relative;
        }

        .config-file .highlight {
            color: #ffcc00;
            font-weight: bold;
        }

        .flow-chart {
            text-align: center;
            padding: 20px;
            background: #f0f8ff;
            border-radius: 8px;
        }

        .quiz {
            background: #e3f2fd;
            padding: 20px;
            border-radius: 8px;
            margin: 20px 0;
        }

        .quiz-options {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 10px;
            margin-top: 15px;
        }

        .quiz-option {
            padding: 10px;
            background: white;
            border: 1px solid #ddd;
            border-radius: 5px;
            text-align: center;
            cursor: pointer;
            transition: 0.3s;
        }

        .quiz-option:hover {
            background: #bbdefb;
        }
        
        .quiz-feedback {
            margin-top: 15px;
            padding: 10px;
            border-radius: 5px;
            display: none;
        }
        
        .quiz-feedback.correct {
            background: #c8e6c9;
            color: #2e7d32;
        }
        
        .quiz-feedback.incorrect {
            background: #ffcdd2;
            color: #c62828;
        }
        
        .quiz-option.selected-correct {
            background: #c8e6c9;
            border-color: #2e7d32;
        }
        
        .quiz-option.selected-incorrect {
            background: #ffcdd2;
            border-color: #c62828;
        }

        .terminal-icon {
            position: fixed;
            bottom: 20px;
            right: 20px;
            width: 60px;
            height: 60px;
            background: var(--hospital-blue);
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            color: white;
            font-size: 24px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.2);
        }
    </style>
</head>
<body>
    <div class="header">
        <h1>Linux用户管理入门教学</h1>
        <p>基于医院管理系统的实践学习</p>
    </div>

    <div class="nav">
        <a href="javascript:void(0)" onclick="showSection('basic')">用户基础</a>
        <a href="javascript:void(0)" onclick="showSection('config')">配置文件</a>
        <a href="javascript:void(0)" onclick="showSection('permission')">权限管理</a>
        <a href="javascript:void(0)" onclick="showSection('group')">用户组协作</a>
        <a href="javascript:void(0)" onclick="showSection('practice')">综合实战</a>
        <a href="javascript:void(0)" onclick="showSection('commands')">命令详解</a>
    </div>

    <div class="section" id="basic">
        <h2>🏥 用户与用户组基础</h2>
        
        <div class="flex-container">
            <div class="flex-item">
                <h3>医院场景类比</h3>
                <ul>
                    <li>👨⚕️ <strong>用户 = 医院员工</strong>：每个Linux用户就像医院的一名员工</li>
                    <li>👩⚕️ <strong>用户组 = 科室部门</strong>：将相似职责的用户归为一组</li>
                    <li>👔 <strong>权限 = 工作职责</strong>：限定每个用户/组能做什么</li>
                </ul>
            </div>
            <div class="flex-item">
                <h3>常见用户组</h3>
                <ul>
                    <li>医生组 (doctors)：可修改病历</li>
                    <li>护士组 (nurses)：只读权限</li>
                    <li>管理员 (admin)：系统管理</li>
                    <li>实习医生 (interns)：临时权限</li>
                </ul>
            </div>
        </div>

        <h3>用户生命周期管理</h3>
        <div class="flow-chart">
            [创建用户] → [设置密码] → [分配组] → [权限管理]<br>
            ↖___________修改/删除←_________↙
        </div>

        <div class="command">
            # 创建医生用户和组<br>
            sudo groupadd doctors # 创建一个名为doctors的新用户组<br>
            sudo useradd -m -G doctors dr_wang # 创建用户dr_wang并设置以下参数：-m创建用户主目录，-G将用户添加到doctors附加组<br>
            sudo passwd dr_wang # 为dr_wang用户设置密码，执行后会提示输入新密码<br>
            <br>
            # 修改用户信息<br>
            sudo usermod -c "王医生，儿科主任" dr_wang # 修改dr_wang用户的备注信息，-c参数用于添加用户注释<br>
            <br>
            # 删除用户<br>
            sudo userdel -r dr_zhang  # -r选项同时删除用户主目录和邮件池
        </div>
        
        <h3>课堂检测</h3>
        <div class="quiz">
            <p>在Linux系统中，创建一个新用户并将其添加到doctors组的正确命令是：</p>
            <div class="quiz-options">
                <div class="quiz-option" data-correct="false">A) useradd dr_li && groupadd -g doctors dr_li</div>
                <div class="quiz-option" data-correct="true">B) sudo useradd -m -G doctors dr_li</div>
                <div class="quiz-option" data-correct="false">C) sudo adduser doctors dr_li</div>
            </div>
            <div class="quiz-feedback correct">正确！useradd命令配合-m（创建主目录）和-G（指定附加组）选项可以创建用户并添加到指定组。</div>
            <div class="quiz-feedback incorrect">不正确。正确的命令是sudo useradd -m -G doctors dr_li，其中-m选项创建主目录，-G选项指定附加组。</div>
        </div>
    </div>

    <div class="section" id="config">
        <h2>📄 核心配置文件</h2>
        
        <h3>/etc/passwd 文件解析</h3>
        <div class="config-file">
            <span class="highlight">dr_wang</span>:x:<span class="highlight">1001</span>:<span class="highlight">1001</span>:Doctor Wang:/home/dr_wang:/bin/bash<br>
            ↑用户名 ↑密码占位 ↑UID ↑GID ↑描述 ↑主目录 ↑Shell
        </div>
        
        <div class="warning">
            ⚠️ <strong>重点记忆UID</strong>：<br>
            - 0 = root（超级管理员）<br>
            - 1-999 = 系统用户<br>
            - 1000+ = 普通用户
        </div>

        <h3>其他重要配置文件</h3>
        <table>
            <tr>
                <th>文件路径</th>
                <th>用途</th>
                <th>内容示例</th>
            </tr>
            <tr>
                <td>/etc/shadow</td>
                <td>存储加密后的密码</td>
                <td>dr_wang:$6$salt$hashedpassword:19000:0:99999:7:::</td>
            </tr>
            <tr>
                <td>/etc/group</td>
                <td>用户组信息</td>
                <td>doctors:x:1001:dr_wang,dr_li</td>
            </tr>
            <tr>
                <td>/etc/sudoers</td>
                <td>sudo权限配置</td>
                <td>%doctors ALL=(ALL) /usr/bin/apt</td>
            </tr>
        </table>
        
        <h3>课堂检测</h3>
        <div class="quiz">
            <p>在Linux系统中，哪个文件存储了用户组的信息？</p>
            <div class="quiz-options">
                <div class="quiz-option" data-correct="false">A) /etc/passwd</div>
                <div class="quiz-option" data-correct="true">B) /etc/group</div>
                <div class="quiz-option" data-correct="false">C) /etc/shadow</div>
            </div>
            <div class="quiz-feedback correct">正确！/etc/group文件存储了系统中所有用户组的信息，包括组名、组ID以及组成员列表。</div>
            <div class="quiz-feedback incorrect">不正确。/etc/group文件存储了系统中所有用户组的信息，而不是/etc/passwd（存储用户信息）或/etc/shadow（存储加密密码）。</div>
        </div>
    </div>

    <div class="section" id="permission">
        <h2>📂 文件权限管理系统</h2>
        
        <h3>权限符号解析</h3>
        <table>
            <tr>
                <th>权限</th>
                <th>数字</th>
                <th>说明</th>
            </tr>
            <tr>
                <td>rwx</td>
                <td>7</td>
                <td>4(r)+2(w)+1(x)</td>
            </tr>
            <tr>
                <td>r-x</td>
                <td>5</td>
                <td>4(r)+0(w)+1(x)</td>
            </tr>
            <tr>
                <td>r--</td>
                <td>4</td>
                <td>4(r)+0(w)+0(x)</td>
            </tr>
            <tr>
                <td>---</td>
                <td>0</td>
                <td>无权限</td>
            </tr>
        </table>

        <h3>医院病历权限设置</h3>
        <div class="command">
            # 设置病历目录权限<br>
            sudo chmod 750 /hospital/records # 设置/hospital/records目录的权限为750，表示：所有者(7)有读、写、执行权限；同组用户(5)有读和执行权限；其他用户(0)无任何权限<br>
            # 递归设置子目录权限<br>
            sudo chmod -R 750 /hospital/records # 使用-R参数递归地设置/hospital/records目录及其所有子目录和文件的权限为750
        </div>

        <div class="flex-container">
            <div class="flex-item">
                <h4>权限效果：</h4>
                <ul>
                    <li>医生（所有者）：可读写执行 (rwx)</li>
                    <li>同科室（组）：可读可执行 (r-x)</li>
                    <li>其他人：无权限 (---)</li>
                </ul>
            </div>
            <div class="flex-item">
                <h4>特殊权限位：</h4>
                <table>
                    <tr>
                        <th>权限位</th>
                        <th>数字</th>
                        <th>作用</th>
                    </tr>
                    <tr>
                        <td>SUID</td>
                        <td>4</td>
                        <td>执行时以所有者权限运行</td>
                    </tr>
                    <tr>
                        <td>SGID</td>
                        <td>2</td>
                        <td>继承目录组权限</td>
                    </tr>
                    <tr>
                        <td>Sticky</td>
                        <td>1</td>
                        <td>只有所有者能删除文件</td>
                    </tr>
                </table>
            </div>
        </div>
        
        <h3>课堂检测</h3>
        <div class="quiz">
            <p>要设置一个目录，使得所有者有完全权限，同组用户可以读取和执行，其他用户无权限，应使用的权限数字是：</p>
            <div class="quiz-options">
                <div class="quiz-option" data-correct="false">A) 755</div>
                <div class="quiz-option" data-correct="true">B) 750</div>
                <div class="quiz-option" data-correct="false">C) 700</div>
            </div>
            <div class="quiz-feedback correct">正确！750对应的权限是rwxr-x---，即所有者(7=rwx)有完全权限，同组用户(5=r-x)可以读取和执行，其他用户(0=---)无权限。</div>
            <div class="quiz-feedback incorrect">不正确。750才是正确答案，对应的权限是rwxr-x---，即所有者有完全权限，同组用户可以读取和执行，其他用户无权限。</div>
        </div>
    </div>

    <div class="section" id="group">
        <h2>👥 用户组协作管理</h2>
        
        <h3>用户组管理决策树</h3>
        <div class="flow-chart">
            需要新增权限？<br>
            → Yes → 添加用户到新组（usermod -aG）<br>
            → No  → 修改文件所属组（chgrp）
        </div>

        <h3>跨组访问冲突案例</h3>
        <div class="command">
            # 问题：护士李无法访问儿科病历<br>
            # 解决方案：将护士李添加到儿科组<br>
            sudo usermod -aG pediatrics nurse_li # 使用usermod命令修改用户nurse_li的组成员关系，-a参数表示追加（不删除已有组），-G参数指定要添加的附加组pediatrics<br>
            <br>
            # 验证用户所在组<br>
            groups nurse_li # 显示用户nurse_li所属的所有组，此命令会列出该用户的主组和所有附加组
        </div>

        <h3>临时权限管理</h3>
        <div class="command">
            # 为会诊专家提供临时访问权限<br>
            sudo setfacl -m u:dr_expert:r-x /hospital/records/patient042 # 使用setfacl命令设置访问控制列表(ACL)，-m表示修改ACL，u:dr_expert:r-x指定为用户dr_expert添加读取和执行权限<br>
            <br>
            # 设置权限过期时间（使用at命令）<br>
            echo "sudo setfacl -x u:dr_expert /hospital/records/patient042" | at 18:00 # 使用at命令在指定时间(18:00)执行命令，管道前的echo命令输出要执行的内容：移除dr_expert用户对patient042的ACL权限(-x表示删除ACL条目)
        </div>

        <div class="warning">
            ⚠️ 用户组最佳实践：<br>
            - 按功能而非人员创建组<br>
            - 定期审查组成员<br>
            - 使用嵌套组管理复杂权限<br>
            - 记录所有权限变更
        </div>
        
        <h3>课堂检测</h3>
        <div class="quiz">
            <p>要将一个用户添加到多个组而不删除其原有组成员身份，应该使用哪个命令？</p>
            <div class="quiz-options">
                <div class="quiz-option" data-correct="false">A) sudo usermod -G doctors,nurses dr_li</div>
                <div class="quiz-option" data-correct="true">B) sudo usermod -aG doctors,nurses dr_li</div>
                <div class="quiz-option" data-correct="false">C) sudo groupadd -g doctors,nurses dr_li</div>
            </div>
            <div class="quiz-feedback correct">正确！usermod命令配合-aG选项可以将用户添加到新组而不删除其原有组成员身份，其中-a表示append（追加）。</div>
            <div class="quiz-feedback incorrect">不正确。正确的命令是sudo usermod -aG doctors,nurses dr_li，其中-a选项（append）确保不会删除用户原有的组成员身份。</div>
        </div>
    </div>

    <div class="section" id="practice">
        <h2>🔧 综合实战演练</h2>
        
        <h3>急诊科系统搭建</h3>
        <div class="command">
            # 创建急诊科用户组<br>
            sudo groupadd emergency # 创建一个名为emergency的新用户组，用于管理急诊科人员<br>
            # 创建目录结构<br>
            sudo mkdir -p /hospital/emergency/records # 使用mkdir命令创建目录，-p参数表示如果父目录不存在则自动创建父目录<br>
            # 设置目录权限<br>
            sudo chown root:emergency /hospital/emergency/records # 使用chown命令更改目录的所有者和所属组，将所有者设为root，所属组设为emergency<br>
            sudo chmod 770 /hospital/emergency/records # 设置目录权限为770，表示：所有者(7)有读、写、执行权限；同组用户(7)有读、写、执行权限；其他用户(0)无任何权限
        </div>

        <h3>权限继承示例</h3>
        <div class="command">
            # 设置目录的SGID权限（继承组权限）<br>
            sudo chmod g+s /hospital/emergency/records # 为目录设置SGID权限，g+s表示设置组的特殊权限位。当目录设置了SGID权限后，在该目录下创建的新文件会自动继承该目录的组所有权<br>
            # 新建文件将自动继承组权限<br>
            touch /hospital/emergency/records/patient_001.txt # 使用touch命令创建一个空文件，由于父目录设置了SGID权限，这个新文件会自动继承父目录的组所有权
        </div>

        <h3>常见错误处理</h3>
        <table>
            <tr>
                <th>现象</th>
                <th>检查步骤</th>
                <th>解决方案</th>
            </tr>
            <tr>
                <td>Permission denied</td>
                <td>1. ls -l<br>2. id用户</td>
                <td>chmod/chown调整权限</td>
            </tr>
            <tr>
                <td>用户不存在</td>
                <td>cat /etc/passwd</td>
                <td>useradd重新创建用户</td>
            </tr>
            <tr>
                <td>组不存在</td>
                <td>cat /etc/group</td>
                <td>groupadd创建组</td>
            </tr>
            <tr>
                <td>无法修改密码</td>
                <td>ls -l /etc/shadow</td>
                <td>使用sudo或切换到root</td>
            </tr>
        </table>

        <div class="warning">
            ⚠️ 注意：禁止使用777权限！<br>
            正确做法：<br>
            - 创建适当的用户组<br>
            - 将需要访问的用户添加到组中<br>
            - 设置合适的组权限
        </div>

        <h3>课堂检测</h3>
        <div class="quiz">
            <p>当前权限为rw-r-----，对应的数字是：</p>
            <div class="quiz-options">
                <div class="quiz-option" data-correct="true">A) 640</div>
                <div class="quiz-option" data-correct="false">B) 750</div>
                <div class="quiz-option" data-correct="false">C) 600</div>
            </div>
            <div class="quiz-feedback correct">正确！rw-r-----对应的数字权限是640，即所有者(6=rw-)可读写，同组用户(4=r--)只读，其他用户(0=---)无权限。</div>
            <div class="quiz-feedback incorrect">不正确。rw-r-----对应的数字权限是640，即所有者可读写，同组用户只读，其他用户无权限。</div>
        </div>

        <h3>实践练习</h3>
        <ol>
            <li>创建一个新的科室组并配置相应权限</li>
            <li>为临时会诊医生设置ACL权限</li>
            <li>配置并查看文件访问审计日志</li>
            <li>设置目录的权限继承</li>
            <li>分析审计日志并生成报告</li>
        </ol>
    </div>

    <div class="section" id="commands">
        <h2>📚 附录：命令详解</h2>
        
        <div class="command-list">
            <h3>命令清单</h3>
            <div class="command-nav">
                <a href="#useradd">useradd</a> | 
                <a href="#usermod">usermod</a> | 
                <a href="#userdel">userdel</a> | 
                <a href="#passwd">passwd</a> | 
                <a href="#groupadd">groupadd</a> | 
                <a href="#groupmod">groupmod</a> | 
                <a href="#groupdel">groupdel</a> | 
                <a href="#gpasswd">gpasswd</a> | 
                <a href="#chmod">chmod</a> | 
                <a href="#chown">chown</a> | 
                <a href="#chgrp">chgrp</a> | 
                <a href="#setfacl">setfacl</a>
            </div>
        </div>
        
        <style>
            .command-list {
                background: #e3f2fd;
                padding: 15px;
                border-radius: 8px;
                margin-bottom: 20px;
            }
            
            .command-nav {
                display: flex;
                flex-wrap: wrap;
                gap: 10px;
                justify-content: center;
            }
            
            .command-nav a {
                color: var(--hospital-blue);
                text-decoration: none;
                padding: 5px 10px;
                border-radius: 4px;
                background: white;
                transition: 0.3s;
            }
            
            .command-nav a:hover {
                background: #bbdefb;
            }
        </style>
        
        <h3>用户管理命令详解</h3>
        
        <h4 id="useradd">useradd - 创建新用户</h4>
        <div class="command">
            # 语法格式
            useradd [选项] 用户名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-m</td>
                <td>创建用户的主目录</td>
                <td>useradd -m dr_wang</td>
            </tr>
            <tr>
                <td>-d 目录</td>
                <td>指定用户主目录的路径</td>
                <td>useradd -m -d /home/doctors/wang dr_wang</td>
            </tr>
            <tr>
                <td>-u UID</td>
                <td>指定用户的UID</td>
                <td>useradd -u 1100 dr_wang</td>
            </tr>
            <tr>
                <td>-g 组名</td>
                <td>指定用户的主组</td>
                <td>useradd -g doctors dr_wang</td>
            </tr>
            <tr>
                <td>-G 组名[,...]</td>
                <td>指定用户的附加组</td>
                <td>useradd -G doctors,admin dr_wang</td>
            </tr>
            <tr>
                <td>-s shell路径</td>
                <td>指定用户的登录shell</td>
                <td>useradd -s /bin/bash dr_wang</td>
            </tr>
            <tr>
                <td>-c 注释</td>
                <td>添加用户的注释信息</td>
                <td>useradd -c "王医生，儿科主任" dr_wang</td>
            </tr>
            <tr>
                <td>-e 日期</td>
                <td>指定账户的过期日期(YYYY-MM-DD)</td>
                <td>useradd -e 2023-12-31 intern_li</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 为实习医生创建临时账户：<code>useradd -m -G interns -e 2023-06-30 -c "李实习，儿科实习医生" intern_li</code><br>
            - 为新入职医生创建账户：<code>useradd -m -G doctors,pediatrics -c "张医生，儿科医师" dr_zhang</code>
        </div>
        
        <h4 id="usermod">usermod - 修改用户账户</h4>
        <div class="command">
            # 语法格式
            usermod [选项] 用户名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-c 注释</td>
                <td>修改用户的注释信息</td>
                <td>usermod -c "王医生，儿科副主任" dr_wang</td>
            </tr>
            <tr>
                <td>-d 目录</td>
                <td>修改用户的主目录</td>
                <td>usermod -d /home/doctors/wang dr_wang</td>
            </tr>
            <tr>
                <td>-g 组名</td>
                <td>修改用户的主组</td>
                <td>usermod -g surgeons dr_wang</td>
            </tr>
            <tr>
                <td>-G 组名[,...]</td>
                <td>替换用户的所有附加组</td>
                <td>usermod -G surgeons,admin dr_wang</td>
            </tr>
            <tr>
                <td>-aG 组名[,...]</td>
                <td>将用户添加到新的附加组（不删除原有组）</td>
                <td>usermod -aG emergency dr_wang</td>
            </tr>
            <tr>
                <td>-l 新用户名</td>
                <td>修改用户的登录名</td>
                <td>usermod -l dr_wang_li dr_wang</td>
            </tr>
            <tr>
                <td>-L</td>
                <td>锁定用户账户（禁止登录）</td>
                <td>usermod -L dr_zhang</td>
            </tr>
            <tr>
                <td>-U</td>
                <td>解锁用户账户</td>
                <td>usermod -U dr_zhang</td>
            </tr>
            <tr>
                <td>-e 日期</td>
                <td>修改账户的过期日期</td>
                <td>usermod -e 2024-06-30 intern_li</td>
            </tr>
            <tr>
                <td>-s shell路径</td>
                <td>修改用户的登录shell</td>
                <td>usermod -s /bin/bash dr_wang</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 医生调岗：<code>usermod -g surgeons -c "王医生，外科医师" dr_wang</code><br>
            - 添加临时急诊权限：<code>usermod -aG emergency dr_wang</code><br>
            - 锁定离职医生账户：<code>usermod -L -e $(date +%Y-%m-%d) dr_zhang</code>
        </div>
        
        <h4 id="userdel">userdel - 删除用户账户</h4>
        <div class="command">
            # 语法格式
            userdel [选项] 用户名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-r</td>
                <td>删除用户的主目录和邮件池</td>
                <td>userdel -r dr_zhang</td>
            </tr>
            <tr>
                <td>-f</td>
                <td>强制删除用户，即使用户仍然在登录状态</td>
                <td>userdel -f dr_zhang</td>
            </tr>
            <tr>
                <td>-Z</td>
                <td>删除用户的SELinux用户映射</td>
                <td>userdel -Z dr_zhang</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 删除实习结束的实习医生账户：<code>userdel -r intern_li</code><br>
            - 删除离职医生账户：<code>userdel -r dr_zhang</code>
        </div>
        
        <h4 id="passwd">passwd - 管理用户密码</h4>
        <div class="command">
            # 语法格式
            passwd [选项] [用户名]
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>无参数</td>
                <td>修改当前用户的密码</td>
                <td>passwd</td>
            </tr>
            <tr>
                <td>用户名</td>
                <td>修改指定用户的密码（需要root权限）</td>
                <td>passwd dr_wang</td>
            </tr>
            <tr>
                <td>-l</td>
                <td>锁定指定用户的密码</td>
                <td>passwd -l dr_zhang</td>
            </tr>
            <tr>
                <td>-u</td>
                <td>解锁指定用户的密码</td>
                <td>passwd -u dr_zhang</td>
            </tr>
            <tr>
                <td>-d</td>
                <td>删除指定用户的密码（使账户无密码）</td>
                <td>passwd -d guest</td>
            </tr>
            <tr>
                <td>-e</td>
                <td>强制用户下次登录时修改密码</td>
                <td>passwd -e dr_wang</td>
            </tr>
            <tr>
                <td>-n 天数</td>
                <td>设置密码的最短使用期限</td>
                <td>passwd -n 7 dr_wang</td>
            </tr>
            <tr>
                <td>-x 天数</td>
                <td>设置密码的最长使用期限</td>
                <td>passwd -x 90 dr_wang</td>
            </tr>
            <tr>
                <td>-w 天数</td>
                <td>设置密码过期前的警告天数</td>
                <td>passwd -w 7 dr_wang</td>
            </tr>
            <tr>
                <td>-i 天数</td>
                <td>设置密码过期后的宽限天数</td>
                <td>passwd -i 3 dr_wang</td>
            </tr>
            <tr>
                <td>-S</td>
                <td>显示指定用户的密码状态</td>
                <td>passwd -S dr_wang</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 为新入职医生设置初始密码：<code>passwd dr_wang</code><br>
            - 强制医生定期更新密码：<code>passwd -x 90 -w 7 -e dr_wang</code><br>
            - 临时禁用账户：<code>passwd -l dr_zhang</code>
        </div>
        
        <h3>用户组管理命令详解</h3>
        
        <h4 id="groupadd">groupadd - 创建新用户组</h4>
        <div class="command">
            # 语法格式
            groupadd [选项] 组名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-g GID</td>
                <td>指定新组的GID</td>
                <td>groupadd -g 1100 doctors</td>
            </tr>
            <tr>
                <td>-r</td>
                <td>创建系统组（GID在系统预留范围内）</td>
                <td>groupadd -r hospital-sys</td>
            </tr>
            <tr>
                <td>-f</td>
                <td>如果组已存在则成功退出</td>
                <td>groupadd -f doctors</td>
            </tr>
            <tr>
                <td>-K KEY=VALUE</td>
                <td>覆盖/etc/login.defs中的默认值</td>
                <td>groupadd -K GID_MIN=1000 doctors</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 创建医生组：<code>groupadd doctors</code><br>
            - 创建特定科室组：<code>groupadd pediatrics</code><br>
            - 创建系统服务组：<code>groupadd -r hospital-sys</code>
        </div>
        
        <h4 id="groupmod">groupmod - 修改用户组</h4>
        <div class="command">
            # 语法格式
            groupmod [选项] 组名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-g GID</td>
                <td>修改组的GID</td>
                <td>groupmod -g 1200 doctors</td>
            </tr>
            <tr>
                <td>-n 新组名</td>
                <td>修改组的名称</td>
                <td>groupmod -n physicians doctors</td>
            </tr>
            <tr>
                <td>-p 密码</td>
                <td>修改组的密码（加密形式）</td>
                <td>groupmod -p encrypted_password doctors</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 重命名科室组：<code>groupmod -n cardiology heart</code><br>
            - 调整组ID：<code>groupmod -g 2001 emergency</code>
        </div>
        
        <h4 id="groupdel">groupdel - 删除用户组</h4>
        <div class="command">
            # 语法格式
            groupdel [选项] 组名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-f</td>
                <td>强制删除组，即使该组是用户的主组</td>
                <td>groupdel -f oldgroup</td>
            </tr>
            <tr>
                <td>-R</td>
                <td>在chroot环境中应用更改</td>
                <td>groupdel -R /mnt/system oldgroup</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 删除临时项目组：<code>groupdel project-temp</code><br>
            - 强制删除废弃的组：<code>groupdel -f oldgroup</code>
        </div>
        
        <h4 id="gpasswd">gpasswd - 管理用户组</h4>
        <div class="command">
            # 语法格式
            gpasswd [选项] 组名
        </div>
        <table>
            <tr>
                <th>参数</th>
                <th>说明</th>
                <th>示例</th>
            </tr>
            <tr>
                <td>-a 用户</td>
                <td>将用户添加到组</td>
                <td>gpasswd -a dr_wang doctors</td>
            </tr>
            <tr>
                <td>-d 用户</td>
                <td>从组中删除用户</td>
                <td>gpasswd -d dr_zhang doctors</td>
            </tr>
            <tr>
                <td>-r</td>
                <td>删除组密码</td>
                <td>gpasswd -r doctors</td>
            </tr>
            <tr>
                <td>-A 用户[,...]</td>
                <td>设置组管理员列表</td>
                <td>gpasswd -A dr_wang,dr_li doctors</td>
            </tr>
            <tr>
                <td>-M 用户[,...]</td>
                <td>设置组成员列表</td>
                <td>gpasswd -M dr_wang,dr_li,dr_zhang doctors</td>
            </tr>
        </table>
        <div class="warning">
            ⚠️ <strong>医院场景应用</strong>：<br>
            - 添加医生到科室组：<code>gpasswd -a dr_wang pediatrics</code><br>
            - 设置科室组管理员：<code>gpasswd -A dr_wang pediatrics</code><br>
            - 批量设置组成员：<code>gpasswd -M dr_wang,dr_li,dr_zhang pediatrics</code>
        </div>
        
        <h3>权限管理命令速查表</h3>
        <div class="command">
            # 权限管理<br>
            <span id="chmod">chmod</span> 750 目录 # 修改目录的权限为750，表示：所有者有读、写、执行权限(7)；同组用户有读和执行权限(5)；其他用户无权限(0)<br>
            <span id="chown">chown</span> 用户:组 文件 # 修改文件的所有者和所属组，同时更改文件的用户所有权和组所有权<br>
            <span id="chgrp">chgrp</span> 组名 文件 # 仅修改文件的所属组，不改变文件的所有者<br>
            <span id="setfacl">setfacl</span> -m u:用户:权限 文件 # 设置文件的访问控制列表(ACL)，为指定用户添加特定权限，-m表示修改ACL
            # 权限管理<br>
            chmod 750 目录 # 修改目录的权限为750，表示：所有者有读、写、执行权限(7)；同组用户有读和执行权限(5)；其他用户无权限(0)<br>
            chown 用户:组 文件 # 修改文件的所有者和所属组，同时更改文件的用户所有权和组所有权<br>
            chgrp 组名 文件 # 仅修改文件的所属组，不改变文件的所有者<br>
            setfacl -m u:用户:权限 文件 # 设置文件的访问控制列表(ACL)，为指定用户添加特定权限，-m表示修改ACL
        </div>
    </div>

    <div class="terminal-icon">$_</div>
    
    <script>
        // 页面加载时显示默认页面（用户基础）
        document.addEventListener('DOMContentLoaded', function() {
            showSection('basic');
            initQuizzes();
        });
        
        // 为错误选项提供详细解释的函数
        function getDetailedErrorExplanation(optionText, correctOption, quiz) {
            // 根据选项内容提供具体的错误解释
            if(optionText.includes('useradd dr_li && groupadd -g doctors dr_li')) {
                return '这个命令有两个问题：<br>1. 语法错误：groupadd -g 参数用于指定组ID而不是添加用户到组<br>2. 顺序错误：应该先创建组，再创建用户并添加到组<br>执行结果：可能会创建用户dr_li，但不会将其添加到doctors组，反而会尝试创建一个名为doctors的新组并指定dr_li为组ID，这会导致错误。';
            }
            else if(optionText.includes('sudo adduser doctors dr_li')) {
                return 'adduser命令的参数顺序与您使用的不同。正确格式应为：adduser [用户名] [组名]，而不是相反。<br>执行结果：系统会尝试创建一个名为doctors的用户，并将其添加到名为dr_li的组中，这与预期目标完全相反。';
            }
            else if(optionText.includes('/etc/passwd')) {
                return '/etc/passwd文件存储的是用户账户信息，包括用户名、UID、GID、主目录和登录shell等，而不是用户组信息。<br>执行结果：如果您在此文件中查找用户组信息，将无法找到完整的组成员列表。';
            }
            else if(optionText.includes('/etc/shadow')) {
                return '/etc/shadow文件存储的是用户密码的加密哈希值和密码策略信息，而不是用户组信息。<br>执行结果：在此文件中查找用户组信息将完全找不到相关数据。';
            }
            else if(optionText.includes('sudo usermod -G doctors,nurses dr_li')) {
                return '使用usermod命令时，-G选项（不带-a）会替换用户的所有附加组，而不是添加新组。<br>执行结果：这将删除dr_li用户原有的所有组成员身份，只保留doctors和nurses这两个组，可能导致用户失去其他重要权限。';
            }
            else if(optionText.includes('sudo groupadd -g doctors,nurses dr_li')) {
                return '这个命令有两个错误：<br>1. groupadd命令用于创建新组，不是将用户添加到组<br>2. -g参数用于指定组ID，不接受组名列表<br>执行结果：命令会失败，因为参数格式错误，不会产生任何用户组关系变更。';
            }
            else if(optionText.includes('755')) {
                return '权限755对应rwxr-xr-x，这意味着所有者有完全权限，但同组用户和其他用户都有读取和执行权限。<br>执行结果：其他用户将能够读取和执行目录内容，这不符合题目要求的"其他用户无权限"。';
            }
            else if(optionText.includes('700')) {
                return '权限700对应rwx------，这意味着只有所有者有完全权限，同组用户和其他用户都没有任何权限。<br>执行结果：同组用户将无法读取和执行目录内容，这不符合题目要求的"同组用户可以读取和执行"。';
            }
            return "这个选项不正确。正确答案是：" + correctOption;
        }
        
        // 页面切换函数
        function showSection(sectionId) {
            // 隐藏所有页面
            const sections = document.querySelectorAll('.section');
            sections.forEach(section => {
                section.classList.remove('active');
            });
            
            // 显示选中的页面
            const targetSection = document.getElementById(sectionId);
            if (targetSection) {
                targetSection.classList.add('active');
                // 平滑滚动到页面顶部
                window.scrollTo({
                    top: 0,
                    behavior: 'smooth'
                });
            }
        }
        
        // 初始化课堂检测功能
        function initQuizzes() {
            // 获取所有选项
            const quizOptions = document.querySelectorAll('.quiz-option');
            
            // 初始化时隐藏所有反馈信息
            document.querySelectorAll('.quiz-feedback').forEach(feedback => {
                feedback.style.display = 'none';
            });
            
            // 为每个选项添加点击事件
            quizOptions.forEach(option => {
                option.addEventListener('click', function() {
                    // 获取当前测试题
                    const quiz = this.closest('.quiz');
                    
                    // 移除所有选项的选中状态
                    quiz.querySelectorAll('.quiz-option').forEach(opt => {
                        opt.classList.remove('selected-correct', 'selected-incorrect');
                    });
                    
                    // 隐藏所有反馈
                    quiz.querySelectorAll('.quiz-feedback').forEach(feedback => {
                        feedback.style.display = 'none';
                    });
                    
                    // 判断是否选择正确
                    const isCorrect = this.getAttribute('data-correct') === 'true';
                    
                    // 添加选中状态
                    if (isCorrect) {
                        this.classList.add('selected-correct');
                        quiz.querySelector('.quiz-feedback.correct').style.display = 'block';
                    } else {
                        this.classList.add('selected-incorrect');
                        quiz.querySelector('.quiz-feedback.incorrect').style.display = 'block';
                        
                        // 获取选项内容和错误解释
                        const optionText = this.textContent;
                        let errorExplanation = '';
                        
                        // 查找正确选项
                        let correctOption = '';
                        quiz.querySelectorAll('.quiz-option').forEach(opt => {
                            if(opt.getAttribute('data-correct') === 'true') {
                                correctOption = opt.textContent;
                            }
                        });
                        
                        // 为错误答案添加详细解释
                        const incorrectFeedback = quiz.querySelector('.quiz-feedback.incorrect');
                        const originalFeedback = incorrectFeedback.innerHTML;
                        
                        // 添加选项特定的错误解释
                        incorrectFeedback.innerHTML = originalFeedback + '<br><br><strong>错误分析：</strong><br>' + 
                            '您选择了：' + optionText + '<br>' + 
                            '如果按此操作，可能导致的问题：<br>' + 
                            getDetailedErrorExplanation(optionText, correctOption, quiz);
                    }
                });
            });
        }
    </script>
</body>
</html>

    <div class="nav">
        <a href="javascript:void(0)" onclick="showSection('basic')">用户基础</a>
        <a href="javascript:void(0)" onclick="showSection('config')">配置文件</a>
        <a href="javascript:void(0)" onclick="showSection('permission')">权限管理</a>
        <a href="javascript:void(0)" onclick="showSection('group')">用户组协作</a>
        <a href="javascript:void(0)" onclick="showSection('practice')">综合实战</a>
        <a href="javascript:void(0)" onclick="showSection('commands')">命令详解</a>
    </div>

    <a href="#" class="back-to-top" id="backToTop">↑</a>
    <script>
        // 添加返回顶部按钮的显示/隐藏逻辑
        window.onscroll = function() {
            var backToTop = document.getElementById('backToTop');
            if (document.body.scrollTop > 20 || document.documentElement.scrollTop > 20) {
                backToTop.classList.add('visible');
            } else {
                backToTop.classList.remove('visible');
            }
        };

        document.getElementById('backToTop').onclick = function(e) {
            e.preventDefault();
            window.scrollTo({top: 0, behavior: 'smooth'});
        };
    </script>
</body>
</html>